<?php
/**
 * Usage:
 *
 * $this->Curl->url = 'google.com';
 * $this->Curl->post = true; // Set options like this, for a list of new names, see the array below organised by type
 * $this->Curl->postFieldsArray = array('field1' => 'value1', 'field2' => 'value2'); // This urlencode post data for you
 * $this->Curl->followLocation = true; // Make sure you use a boolean here, my class will do type checking
 * $this->Curl->userAgent = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20060601 Firefox/2.0.0.1 (Ubuntu-edgy)';
 * $this->Curl->execute(); // execute() returns the output instead of writing it straight to the page like normal cURL
 * $this->Curl->grab('<p>', '</p>'); // Matches the first set of these, and returns whats in between
 * 
 **/

if (! function_exists ( 'curl_init' )) {
	die ( '
        cURL is not installed.<br />
        <b>Linux (Ubuntu) Users:</b><pre>sudo apt-get install php5-curl</pre>
        (or use your favourite package manager) then restart Apache:
        <pre>sudo /etc/init.d/apache2 restart</pre>
        <b>Win32 Users:</b>  In order to enable this module on a Windows environment, libeay32.dll and ssleay32.dll  must be present in your PATH.<br />' ) ;
}

class Curl extends AppModel {
	var $name = 'Curl' ;
	var $handle ; // Curl handle	var $output = null ; // Output from curl_exec	var $return = null ; // Return value for curl_exec	var $options = array ( 'bool' => array ( 'autoReferer' => CURLOPT_AUTOREFERER , 'binaryTransfer' => CURLOPT_BINARYTRANSFER , 'cookieSession' => CURLOPT_COOKIESESSION , 'crlf' => CURLOPT_CRLF , 'dnsUseGlobalCache' => CURLOPT_DNS_USE_GLOBAL_CACHE , 'failOnError' => CURLOPT_FAILONERROR , 'fileModifiedTime' => CURLOPT_FILETIME , 'followLocation' => CURLOPT_FOLLOWLOCATION , 'forbidReuse' => CURLOPT_FORBID_REUSE , 'freshConnect' => CURLOPT_FRESH_CONNECT , 'ftpUseEprt' => CURLOPT_FTP_USE_EPRT , 'ftpUseEpsv' => CURLOPT_FTP_USE_EPSV , 'ftpAppend' => CURLOPT_FTPAPPEND , 'ftpAscii' => CURLOPT_FTPASCII , 'ftpListOnly' => CURLOPT_FTPLISTONLY , 'header' => CURLOPT_HEADER , 'httpGet' => CURLOPT_HTTPGET , 'httpProxyTunnel' => CURLOPT_HTTPPROXYTUNNEL , 'mute' => CURLOPT_MUTE , 'netRc' => CURLOPT_NETRC , 'nobody' => CURLOPT_NOBODY , 'noProgress' => CURLOPT_NOPROGRESS , 'noSignal' => CURLOPT_NOSIGNAL , 'post' => CURLOPT_POST , 'put' => CURLOPT_PUT , 'returnTransfer' => CURLOPT_RETURNTRANSFER , 'sslVerifyPeer' => CURLOPT_SSL_VERIFYPEER , 'transferText' => CURLOPT_TRANSFERTEXT , 'unrestrictedAuth' => CURLOPT_UNRESTRICTED_AUTH , 'upload' => CURLOPT_UPLOAD , 'verbose' => CURLOPT_VERBOSE ) , 

	'int' => array ( 'bufferSize' => CURLOPT_BUFFERSIZE , 'closePolicy' => CURLOPT_CLOSEPOLICY , 'connectTimeout' => CURLOPT_CONNECTTIMEOUT , 'dnsCacheTimeout' => CURLOPT_DNS_CACHE_TIMEOUT , 'ftpSslAuth' => CURLOPT_FTPSSLAUTH , 'httpVersion' => CURLOPT_HTTP_VERSION , 'httpAuth' => CURLOPT_HTTPAUTH , 'inFileSize' => CURLOPT_INFILESIZE , 'lowSpeedLimit' => CURLOPT_LOW_SPEED_LIMIT , 'lowSpeedTime' => CURLOPT_LOW_SPEED_TIME , 'maxConnects' => CURLOPT_MAXCONNECTS , 'maxRedirs' => CURLOPT_MAXREDIRS , 'port' => CURLOPT_PORT , 'proxyAuth' => CURLOPT_PROXYAUTH , 'proxyPort' => CURLOPT_PROXYPORT , 'proxyType' => CURLOPT_PROXYTYPE , 'resumeFrom' => CURLOPT_RESUME_FROM , 'sslVerifyHost' => CURLOPT_SSL_VERIFYHOST , 'sslVersion' => CURLOPT_SSLVERSION , 'timeCondition' => CURLOPT_TIMECONDITION , 'timeout' => CURLOPT_TIMEOUT , 'timeValue' => CURLOPT_TIMEVALUE ) , 

	'string' => array ( 'caInfo' => CURLOPT_CAINFO , 'caPath' => CURLOPT_CAPATH , 'cookie' => CURLOPT_COOKIE , 'cookieFile' => CURLOPT_COOKIEFILE , 'cookieJar' => CURLOPT_COOKIEJAR , 'customRequest' => CURLOPT_CUSTOMREQUEST , 'egbSocket' => '' , //CURLOPT_EGBSOCKET 'encoding' => CURLOPT_ENCODING , 'ftpPort' => CURLOPT_FTPPORT , 'interface' => CURLOPT_INTERFACE , 'kerberosLevel' => CURLOPT_KRB4LEVEL , 'krb4Level' => CURLOPT_KRB4LEVEL , 'postFields' => CURLOPT_POSTFIELDS , 'proxy' => CURLOPT_PROXY , 'proxyUserPwd' => CURLOPT_PROXYUSERPWD , 'randomFile' => CURLOPT_RANDOM_FILE , 'range' => CURLOPT_RANGE , 'referer' => CURLOPT_REFERER , 'sslCipherList' => CURLOPT_SSL_CIPHER_LIST , 'sslCertificate' => CURLOPT_SSLCERT , 'sslCertificatePassword' => CURLOPT_SSLCERTPASSWD , 'sslCertificateType' => CURLOPT_SSLCERTTYPE , 'sslEngine' => CURLOPT_SSLENGINE , 'sslEngineDefault' => CURLOPT_SSLENGINE_DEFAULT , 'sslKey' => CURLOPT_SSLKEY , 'sslKeyPassword' => CURLOPT_SSLKEYPASSWD , 'sslKeyType' => CURLOPT_SSLKEYTYPE , 'url' => CURLOPT_URL , 'userAgent' => CURLOPT_USERAGENT , 'userPwd' => CURLOPT_USERPWD ) , 

	'array' => array ( 'postFieldsArray' => 'postFieldsArray' ) ) ;
	
	function Curl () {
		$this->handle = curl_init () ;
	}
	
	function getInfo ( $key ) {
		$array = curl_getinfo ( $this->handle ) ;
		return $array [ $key ] ;
	}
	
	function url () {
		return $this->getInfo ( 'url' ) ;
	}
	
	function contentType () {
		return $this->getInfo ( 'content_type' ) ;
	}
	
	function httpCode () {
		return $this->getInfo ( 'http_code' ) ;
	}
	
	function headerSize () {
		return $this->getInfo ( 'header_size' ) ;
	}
	
	function requestSize () {
		return $this->getInfo ( 'request_size' ) ;
	}
	
	function fileTime () {
		return $this->getInfo ( 'filetime' ) ;
	}
	
	function sslVerifyResult () {
		return $this->getInfo ( 'ssl_verify_result' ) ;
	}
	
	function redirectCount () {
		return $this->getInfo ( 'redirect_count' ) ;
	}
	
	function totalTime () {
		return $this->getInfo ( 'total_time' ) ;
	}
	
	function nameLookupTime () {
		return $this->getInfo ( 'namelookup_time' ) ;
	}
	
	function connectTime () {
		return $this->getInfo ( 'connect_time' ) ;
	}
	
	function preTransferTime () {
		return $this->getInfo ( 'pretransfer_time' ) ;
	}
	
	function sizeUpload () {
		return $this->getInfo ( 'size_upload' ) ;
	}
	
	function sizeDownload () {
		return $this->getInfo ( 'size_download' ) ;
	}
	
	function speedDownload () {
		return $this->getInfo ( 'speed_download' ) ;
	}
	
	function speedUpload () {
		return $this->getInfo ( 'speed_upload' ) ;
	}
	
	function downloadContentLength () {
		return $this->getInfo ( 'download_content_length' ) ;
	}
	
	function uploadContentLength () {
		return $this->getInfo ( 'upload_content_length' ) ;
	}
	
	function startTransferTime () {
		return $this->getInfo ( 'starttransfer_time' ) ;
	}
	
	function redirectTime () {
		return $this->getInfo ( 'redirect_time' ) ;
	}
	
	function _parsePostFieldsArray ( $array ) {
		$data = array ( ) ;
		foreach ( $array as $key => $val ) {
			$data [] = urlencode ( $key ) . '=' . urlencode ( $val ) ;
		}
		
		return implode ( '&', $data ) ;
	}
	
	function execute () {
		foreach ( $this->options as $type => $options ) {
			foreach ( $options as $key => $val ) {
				if (isset ( $this->{$key} )) {
					$type_check = 'is_' . $type ;
					if ($type_check ( $this->{$key} )) {
						if ($key == 'postFieldsArray') {
							curl_setopt ( $this->handle, CURLOPT_POSTFIELDS, $this->_parsePostFieldsArray ( $this->{$key} ) ) ;
						} else {
							curl_setopt ( $this->handle, $val, $this->{$key} ) ;
						}
					} else {
						trigger_error ( 'Expected type \'' . $type . '\' for ' . $key, E_USER_ERROR ) ;
					}
				}
			}
		}
		
		ob_start () ;
		$this->return = curl_exec ( $this->handle ) ;
		$this->output = ob_get_contents () ;
		ob_end_clean () ;
		
		return $this->output ;
	}
	
	function grab ( $start , $end ) {
		$startPos = strpos ( $this->output, $start ) ;
		$endPos = strpos ( substr ( $this->output, $startPos ), $end ) + strlen ( $end ) ;
		
		return substr ( $this->output, $startPos, $endPos ) ;
	}
	
	function grabInside ( $start , $end ) {
		$startPos = strpos ( $this->output, $start ) + strlen ( $start ) ;
		$endPos = strpos ( substr ( $this->output, $startPos ), $end ) ;
		
		return trim(substr( $this->output, $startPos, $endPos));
	}
	
	/** Gets start delimeter, end delimeter and an array of pieces to
	* 	put out. Returns the array of needed infomation
	*	delimstart and delimend are arround the pieces of searched data
	*/
	function grab_array ( $start , $delimstart , $delimend , $end ) {
		//cut from start to end
		$this->text = substr ( $this->content, strpos ( $this->content, $start ) + strlen ( $start ) + 1 ) ;
		$this->text = substr ( $this->text, 0, strpos ( $this->text, $end ) ) ;
		
		//getting out the unndeeded and pushing into the array
		$this->searchar = preg_split ( "@$delimstart|$delimend@", $this->text ) ;
	}
	
	
}

?>

